import re
import sys
input = sys.stdin.readline
t = int(input())
class Node():
def __init__(self, p, s, cnt, size):
self.p = p
self.s = s
self.cnt = cnt
self.size = size
@classmethod
def fromString(cls, s):
return cls(s[:3], s[-3:], cls.count(s), len(s))
@classmethod
def merge(cls, a, b):
p = a.p if a.size >= 3 else (a.p+b.p)[:3]
s = b.s if b.size >= 3 else (a.s + b.s)[-3:]
return cls(p, s, a.cnt + b.cnt + cls.count(a.s + b.p), a.size + b.size)
@staticmethod
def count(s):
return sum(s[i:i+4] == "haha" for i in range(len(s) - 3))
def getList():
return map(int, input().split())
def solve():
q = int(input())
w = {}
for _ in range(q):
s = input().rstrip()
if ":" in s:
a, b = s.split(" := ")
w[a] = Node.fromString(b)
else:
a, b, c = re.split(r"\W+", s)
w[a] = Node.merge(w[b], w[c])
print(w[a].cnt)
for _ in range(t):
solve()
672. Richest Customer Wealth | 1470. Shuffle the Array |
1431. Kids With the Greatest Number of Candies | 1480. Running Sum of 1d Array |
682. Baseball Game | 496. Next Greater Element I |
232. Implement Queue using Stacks | 844. Backspace String Compare |
20. Valid Parentheses | 746. Min Cost Climbing Stairs |
392. Is Subsequence | 70. Climbing Stairs |
53. Maximum Subarray | 1527A. And Then There Were K |
1689. Partitioning Into Minimum Number Of Deci-Binary Numbers | 318. Maximum Product of Word Lengths |
448. Find All Numbers Disappeared in an Array | 1155. Number of Dice Rolls With Target Sum |
415. Add Strings | 22. Generate Parentheses |
13. Roman to Integer | 2. Add Two Numbers |
515. Find Largest Value in Each Tree Row | 345. Reverse Vowels of a String |
628. Maximum Product of Three Numbers | 1526A - Mean Inequality |
1526B - I Hate 1111 | 1881. Maximum Value after Insertion |
237. Delete Node in a Linked List | 27. Remove Element |